//
// Created by ysbf on 8/24/20.
//

#include "debug.h"
#include "connectivity/UART.h"
#include "ringbuffer.h"

UARTDriver::UART_INFO info{
    6,
    115200,
    true,
    true,
    UARTDriver::UART_MOOD::T_RX,
    UARTDriver::GPIO::C,
    UARTDriver::GPIO::C,
    6, 7,
};

static UARTDriver uart6_driver(info);
RingBuffer *ringbuffer;

static volatile bool is_running = false;

void send_start() {
  static uint8_t buffer[100];

//  int len=20;
  uint16_t len = ringbuffer->get(buffer, 100);

  if (len != 0) {
    uart6_driver.dma_async_write((uint8_t *) buffer, len, [](uint16_t) {
      send_start();
    });
  } else {
    is_running = false;
  }
}

void my_printf(const char *fmt, ...) // custom printf() function
{

  static uint8_t data[2048];
  static RingBuffer buffer(data, 2048);
  ringbuffer = &buffer;
  //  static bool is_first_time= true;
  //  if(is_first_time) {

  //    UARTDriver::UART_INFO info{
  //        1,
  //        115200,
  //        true,
  //        true,
  //        UARTDriver::UART_MOOD::T_RX,
  //        UARTDriver::GPIO::A,
  //        UARTDriver::GPIO::A,
  //        9,10,
  //    };

  //    UARTDriver::UART_INFO info{
  //        4,
  //        115200,
  //        true,
  //        true,
  //        UARTDriver::UART_MOOD::T_RX,
  //        UARTDriver::GPIO::A,
  //        UARTDriver::GPIO::A,
  //        0,1,
  //    };
  //    UART_INFO info{
  //        4,
  //        115200,
  //        true,
  //        true,
  //        T_RX,
  //        A,
  //        A,
  //        0,1,
  //    };
  //    is_first_time= false;
  //  }
  //  static uint32_t time_last;
  //  Debug("Tx TimeInterval:%d", micros() - time_last);
  //  time_last = micros();

  va_list argp;
  va_start(argp, fmt);

  char string[300];
  int len = vsnprintf(string, sizeof(string), fmt, argp);

  if (len > 0) {
    ringbuffer->save((uint8_t *) string, len);
    //    uart6_driver.dma_async_write((uint8_t *) string, len, [](uint16_t) {});
    if (!is_running) {
      is_running = true;
      send_start();
    }
    //    string[len] = '\r';
    //    string[len + 1] = '\n';

    //    uart6_driver.dma_write_bytes((uint8_t *) &string, len );

  }
  va_end(argp);
}
